/*
 * Huffman.h
 *
 *  Created on: 27 de Mai de 2011
 *      Author: ei10139
 */

#pragma once
#include <vector>
#include <queue>
#include <fstream>
#include <iostream>
#include "Graph.h"
#include "Exceptions.h"
#include "BitStream.h"

class Huffman
{
protected:
	unsigned long charSum[256];
	BitStream bs;
	vector<No *> caracteres;
	priority_queue<No *, vector<No *>, No::lessNo> freq_caracteres;

	No * root;
	FILE *fileSource, *fileOutput;
    unsigned char *psour;	// source pointer
    unsigned char *pout;	// ouput pointer
    unsigned long psourSize, poutSize;
    const char * fileNameInput, *fileNameOutput;
private:
	/**
	 * Funcao que faz a contagem dos diferentes caracteres existentes no ficheiro
	 */
	void countChars();
	/**
	 * Funcao que armazena os dados
	 */
	void store();
	/**
	 * Funcao que carrega os dados
	 */
	void load();
public:
	/**
	 * Construtor da Classe Huffman
	 *
	 * @param: fileNameSource, const char, que representa o nome do ficheiro com o qual vamos trabalhar
	 * @param: fileNameutput, const char, que representa o nome do ficheiro onde quero o resultado
	 */
	Huffman(const char *fileNameSource, const char *fileNameOutput);
	/**
	 * Destrutor da classe Huffman
	 */
	virtual ~Huffman();
	/**
	 * Funcao que realiza a descompressao de um ficheiro comprimido pelo algoritmo de huffman
	 */
	void decompress();
	/**
	 * Funcao que realiza a compressao pelo algoritmo de huffman
	 */
	void compress();
    /**
     *  Funcao que retorna o tamanho de um ficheiro
     *
     *  @param: fp que representa o ficheiro do qual quero saber o tamanho
     *  @return: um inteiro que corresponde ao tamanho do ficheiro em questao
     */
	static int get_file_size(FILE *fp);
};

